// 运行时配置
// import { useState } from 'react';
import type { RequestConfig } from '@umijs/max';
// 错误处理方案： 错误类型
enum ErrorShowType {
  SILENT = 0,
  WARN_MESSAGE = 1,
  ERROR_MESSAGE = 2,
  NOTIFICATION = 3,
  REDIRECT = 9,
}

interface ResponseStructure {
  status: number;
  data: any;
  errorCode?: number;
  errorMessage?: string;
  showType?: ErrorShowType;
}

export const request: RequestConfig = {
  timeout: 1000,
  headers: { 'Content-type': 'application/json' },
  // other axios options you want
  errorConfig: {
    // 错误抛出
    errorThrower: (res: ResponseStructure) => {
      const { status, data, errorCode, errorMessage, showType } = res;
      if (status !== 0) {
        const error: any = new Error(errorMessage);
        error.name = 'BizError';
        error.info = { errorCode, errorMessage, showType, data };
        throw error; // 抛出自制的错误
      }
    },
    // 错误接收及处理
    errorHandler: (error: any, opts: any) => {
      if (opts?.skipErrorHandler) throw error;
      // 我们的 errorThrower 抛出的错误。
      if (error.name === 'BizError') {
        const errorInfo: ResponseStructure | undefined = error.info;
        if (errorInfo) {
          const { errorMessage, errorCode } = errorInfo;
          switch (errorInfo.showType) {
            case ErrorShowType.SILENT:
              // do nothing
              break;
            case ErrorShowType.WARN_MESSAGE:
              alert(errorMessage);
              break;
            case ErrorShowType.ERROR_MESSAGE:
              alert(errorMessage);
              break;
            case ErrorShowType.NOTIFICATION:
              alert({
                description: errorMessage,
                message: errorCode,
              });
              break;
            case ErrorShowType.REDIRECT:
              // TODO: redirect
              break;
            default:
              alert(errorMessage);
          }
        }
      } else if (error.response) {
        // Axios 的错误
        // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
        alert(`Response status:${error.response.status}`);
      } else if (error.request) {
        // 请求已经成功发起，但没有收到响应
        // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例，
        // 而在node.js中是 http.ClientRequest 的实例
        alert('None response! Please retry.');
      } else {
        // 发送请求时出了点问题
        alert('Request error, please retry.');
      }
    },
  },
  // 请求拦截器
  requestInterceptors: [
    (config: any) => {
      console.log(config);

      // 拦截请求配置，进行个性化处理。
      const url = config.url.concat('?token=123');
      return { ...config, url };
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response: any) => {
      // 拦截响应数据，进行个性化处理
      const { data } = response;
      if (!data.success) {
        alert('请求失败！');
      }
      return response;
    },
  ],
};

// 全局初始化数据配置，用于 Layout 用户信息和权限初始化
// 更多信息见文档：https://umijs.org/docs/api/runtime-config#getinitialstate
export async function getInitialState(): Promise<{
  name: string;
  list: number[];
  roleArr: number[];
  // age: number;
  // ageAdd?: any;
}> {
  const arr = await fetch('/api/list')
    .then((response) => response.json())
    .then((res) => {
      return res;
    });
  // let [age, setAge] = useState(20);
  // const ageAdd = () => {
  //   setAge((v) => v + 1);
  // };

  const roleArr = [800, 801, 802, 803];

  return { name: '@umijs/max', list: arr, roleArr };
}

export const layout = () => {
  return {
    title: 'umi项目',
    logo: 'https://img.alicdn.com/tfs/TB1YHEpwUT1gK0jSZFhXXaAtVXa-28-27.svg',
    menu: {
      locale: false,
    },

    // menuHeaderRender: () => <MenuHeader />,
    menuFooterRender: () => <footer>这是底部</footer>,
    onMenuHeaderClick() {
      console.log(111);
    },
  };
};
